/**
 *  Serponix is an arcade game in focus to multiplayer based on the classic game Snake.
 *  Copyright (C) 2010 - 2011  Daniel Vala
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License,
 *  or  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  If you have any question do not hesitate to contact author
 *  on e-mail address: danielvala42@gmail.com
 */
package com.serponix.settings;

import com.serponix.game.Mode;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * Nastavení hry obsahuje všechny nastavitelné parametry ve hře.
 * Může být celé uloženo do souboru.
 * @author Daniel Vala
 */
public class NastaveniHry implements Serializable {

    private List<Map<SnakeAction, Integer>> vsechnyKlavesy;
    private int rychlost;
    private Mode mod;
    private String serverIP;
    private String[] jmenaHracu;
    private int pocetHracu;
    private int port;

    /**
     * Vytvoří prázdné nastavení hry.
     */
    public NastaveniHry() {
        jmenaHracu = new String[4];
    }

    /**
     * Vrátí seznam namapovaných akcí ke klávesám.
     * @return Seznam napamovaných akcí ke klávesám.
     */
    public List<Map<SnakeAction, Integer>> getVsechnyKlavesy() {
        return vsechnyKlavesy;
    }

    /**
     * Vrátí defaultně nastavenou rychlost hry.
     * @return Defaultně nastavená rychlost hry.
     */
    public int getRychlost() {
        return rychlost;
    }

    /**
     * Vrátí defaultně nastavený mód hry.
     * @return Defaultně nastavený mód hry.
     */
    public Mode getMod() {
        return mod;
    }

    /**
     * Vrátí přednastavenou IP adresu serveru.
     * @return Přednastavená adresa serveru.
     */
    public String getServerIP() {
        return serverIP;
    }

    /**
     * Vrátí jméno daného hráče.
     * @param cisloHrace Číslo hráče od 1 do 4.
     * @return Jméno hráče.
     */
    public String getJmeno(int cisloHrace) {
        return jmenaHracu[cisloHrace];
    }

    /**
     * Vrátí počet hráčů od 1 do 4, kteří mohou hrát na tomto počítači.
     * @return počet hráčů, který může hrát na tomto počítači.
     */
    public int getPocetHracu() {
        return pocetHracu;
    }

    /**
     * Vrátí síťový port, na kterém bude server i klient komunikovat.
     * @return Síťový port.
     */
    public int getPort() {
        return port;
    }

    /**
     * Nastaví seznam napamovaných akcí ke klávesám.
     * @param vsechnyKlavesy Celý seznam namapovaných akcí ke klávesám.
     */
    public void setVsechnyKlavesy(List<Map<SnakeAction, Integer>> vsechnyKlavesy) {
        this.vsechnyKlavesy = vsechnyKlavesy;
    }

    /**
     * Nastaví defaultně vybranou rychlost hry.
     * @param rychlost Defaultně vybraná rychlost hry od 0 do 100.
     * @throws IllegalArgumentException Pokud rychlost není v rozmezí 0 až 100.
     */
    public void setRychlost(int rychlost) throws IllegalArgumentException {
        if (rychlost < 0 || rychlost > 100) {
            throw new IllegalArgumentException("Rychlost hry může být nastavena od 0 do 100.");
        }
        this.rychlost = rychlost;
    }

    /**
     * Nastaví defaultně vybraný mód hry.
     * @param mod Defaultně vybraný mód hry.
     */
    public void setMod(Mode mod) {
        this.mod = mod;
    }

    /**
     * Nastaví přednastavenou IP adresu serveru.
     * @param serverIP Přednastavená IP adresa serveru.
     */
    public void setServerIP(String serverIP) {
        this.serverIP = serverIP;
    }

    /**
     * Nastaví jméno daného hráče.
     * @param cisloHrace Číslo hráče od 1 do 4, kterému se nastaví zadané jméno.
     * @param jmeno Jméno, které se nastaví zadanému hráči.
     */
    public void setJmeno(int cisloHrace, String jmeno) {
        jmenaHracu[cisloHrace] = jmeno;
    }

    /**
     * Nastaví počet hráčů, kteří budou moci hrát na jednom počítači.
     * @param pocetHracu Počet hráčů, který bude moci hrát na jednom počítači.
     * @throws IllegalArgumentException Pokud počet hráčů není v rozmezí 1 až 4.
     */
    public void setPocetHracu(int pocetHracu) throws IllegalArgumentException {
        if (pocetHracu < 1 || pocetHracu > 4) {
            throw new IllegalArgumentException("Počet hráčů lze nastavit na 1 až 4.");
        }
        this.pocetHracu = pocetHracu;
    }

    /**
     * Nastaví síťový port hry, na kterém budou server i klient komunikovat.
     * @param port Síťový port hry.
     */
    public void setPort(int port) {
        this.port = port;
    }
}
